package com.zz.utils;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
import java.util.List;

/**
 * HtmlIdGenerator 是一个工具类，用于为HTML文档中的元素生成唯一的ID。
 * 它通过遍历HTML文档，为没有ID的元素分配新的唯一ID，并确保这些ID不会与现有ID冲突。
 */
public class HtmlIdGenerator {

    private static final String AUTO_ID_PREFIX = "prime-id-";

    /**
     * 主方法，用于测试 HtmlIdGenerator 的功能。
     *
     * @param args 命令行参数（未使用）。
     */
    public static void main(String[] args) throws IOException {
        InputStream in = HtmlIdGenerator.class.getClassLoader().getResourceAsStream("demo.html");
        String html = new String(in.readAllBytes(), StandardCharsets.UTF_8);

//        String html = "<html><body><div>Test</div><p id='existing-id'>Hello</p><span></span></body></html>";
        Document doc = Jsoup.parse(html);
        addUniqueIds(doc);
        System.out.println(doc.html());
    }

    /**
     * 为HTML文档中的元素添加唯一的ID。
     * 该方法会遍历文档中的所有元素，为没有ID的元素分配新的唯一ID，
     * 并确保这些ID不会与现有ID冲突。
     *
     * @param doc 包含HTML内容的Document对象。
     */
    public static void addUniqueIds(Document doc) {
        // 匹配以 auto-id- 开头后跟数字的ID
        Pattern autoIdPattern = Pattern.compile("^%s(\\d+)$".formatted(AUTO_ID_PREFIX));
        int maxAutoId = 0;
        List<Element> elementsWithoutId = new ArrayList<>();

        // 第一次遍历：收集无ID元素和最大现有auto-id值
        Elements allElements = doc.body().select("*");
        for (Element element : allElements) {
            if (element.hasAttr("id")) {
                String id = element.id();
                Matcher matcher = autoIdPattern.matcher(id);
                if (matcher.matches()) {
                    int currentId = Integer.parseInt(matcher.group(1));
                    maxAutoId = Math.max(maxAutoId, currentId);
                }
            } else {
                elementsWithoutId.add(element);
            }
        }

        // 第二次遍历：为无ID元素设置新ID
        int nextId = maxAutoId + 1;
        for (Element element : elementsWithoutId) {
            element.attr("id", AUTO_ID_PREFIX + nextId);
            nextId++;
        }
    }
}